home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 140 / Gekkan Dennou Club - 2000.1 Vol. 140 (Japan).7z / Gekkan Dennou Club - 2000.1 Vol. 140 (Japan) (Track 1).bin / tools / has060 / hassrc87.lzh / main.s < prev    next >
Text File  |  1999-10-08  |  36KB  |  1,485 lines

  1. ;----------------------------------------------------------------
  2. ;    X68k High-speed Assembler
  3. ;        メインルーチン
  4. ;        < main.s >
  5. ;
  6. ;    $Id: main.s,v 3.7  1999 10/ 8(Fri) 17:33:03 M.Kamada Exp $
  7. ;
  8. ;        Copyright 1990-94  by Y.Nakamura
  9. ;              1996-99  by M.Kamada
  10. ;----------------------------------------------------------------
  11.  
  12.     .include    DOSCALL.MAC
  13.     .include    has.equ
  14.     .include    symbol.equ
  15.     .include    register.equ
  16.     .include    cputype.equ
  17.     .include    error2.equ
  18.  
  19.     .cpu    68000
  20.     .text
  21.  
  22.  
  23. ;----------------------------------------------------------------
  24. ;    メインプログラム
  25. ;----------------------------------------------------------------
  26. asmmain::
  27.     move.l    #STACKBTM-asmmain,d0
  28.     lea.l    (asmmain,pc,d0.l),sp    ;lea.l (STACKBTM,pc),sp
  29.     move.l    #WORKBEGIN-asmmain,d0
  30.     lea.l    (asmmain,pc,d0.l),a6    ;lea.l (WORKBEGIN,pc),a6
  31.     bsr    meminit            ;メモリ領域の確保
  32.     bsr    workinit        ;ワークエリアの初期化
  33.     bsr    defressym        ;予約済みシンボルの初期化
  34.     bsr    cpuinit            ;CPUモードの初期化
  35.     bsr    makeprndate        ;日時文字列の作成
  36.     bsr    docmdline        ;コマンドラインの解釈
  37.     bsr    predefinesymbol        ;プレデファインシンボルの定義
  38.     tst.b    (DISPTITLE,a6)
  39.     beq    asmmain0
  40.     lea.l    (title_msg,pc),a0
  41.     bsr    printmsg
  42. asmmain0:
  43.     lea.l    (SOURCEPTR,a6),a0
  44.     move.l    a0,(INPFILPTR,a6)
  45.     movea.l    (SOURCEFILE,a6),a0
  46.     bsr    readopen        ;ソースファイルをオープンする
  47.     tst.l    d0
  48.     bmi    filopenabort
  49.     tst.b    (MAKEPRN,a6)
  50.     beq    asmmain1
  51.     movea.l    (PRNFILE,a6),a0
  52.     bsr    prnopen            ;PRNファイルをオープンする
  53.     move.w    d0,(PRNHANDLE,a6)
  54. asmmain1:
  55.     bsr    asmpass1        ;パス1
  56.     bsr    asmpass2        ;パス2
  57.     bsrl    asmpass3,d0        ;パス3
  58.     bsr    tempdelete        ;テンポラリファイルの削除
  59.     tst.w    (NUMOFERR,a6)
  60.     beq    asmmain2
  61.     move.w    #1,-(sp)        ;エラーがあった場合の終了コード
  62.     move.l    (OBJFILE,a6),-(sp)
  63.     DOS    _DELETE            ;オブジェクトファイルを削除する
  64.     addq.l    #4,sp
  65.     lea.l    (beep_msg,pc),a0
  66.     bsr    printmsg        ;ビープ音を鳴らす
  67.     lea.l    (LINEBUF,a6),a0
  68.     lea.l    (fatal_msg1,pc),a1
  69.     bsr    strcpy
  70.     move.w    (NUMOFERR,a6),d0
  71.     ext.l    d0
  72.     moveq.l    #0,d1            ;(左詰め)
  73.     bsr    convdec
  74.     lea.l    (fatal_msg2,pc),a1
  75.     bsr    strcpy
  76.     clr.b    (a0)
  77.     lea.l    (LINEBUF,a6),a0
  78.     bra    asmmain3
  79.  
  80. asmmain2:
  81.     clr.w    -(sp)            ;エラーがなかった場合の終了コード
  82.     lea.l    (no_msg,pc),a0
  83.     tst.b    (DISPTITLE,a6)
  84.     beq    asmmain4
  85. asmmain3:
  86.     bsr    printmsg
  87. asmmain4:
  88.     tst.b    (MAKEPRN,a6)
  89.     beq    asmmain6
  90.     tst.b    (ISPRNSTDOUT,a6)
  91.     bne    asmmain6
  92.     bsr    prnlout
  93.     tst.b    (NOPAGEFF,a6)
  94.     bne    asmmain5
  95.     st.b    (NOPAGEFF,a6)
  96.     lea.l    (pageff_msg,pc),a0
  97.     bsr    prnlout
  98. asmmain5:
  99.     move.w    (PRNHANDLE,a6),-(sp)
  100.     DOS    _CLOSE            ;PRNファイルのクローズ
  101.     addq.l    #2,sp
  102. asmmain6:
  103.     st.b    (NOPAGEFF,a6)
  104.     tst.b    (MAKESYM,a6)
  105.     beq    asmmain9
  106.     move.l    (SYMFILE,a6),d1
  107.     beq    asmmain8        ;ファイル名省略→標準出力へ
  108.     movea.l    d1,a0
  109.     bsr    prnopen            ;シンボルファイルをオープンする
  110.     move.w    d0,(PRNHANDLE,a6)
  111.     movea.l    (SOURCEFILE,a6),a0
  112.     bsr    getfilename
  113.     movea.l    a1,a0
  114.     bsr    prnlout
  115.     lea.l    (main_crlf_msg,pc),a0
  116.     bsr    prnlout
  117.     bsrl    makesymfile,d0        ;シンボルファイルの作成
  118.     move.w    d0,-(sp)
  119.     DOS    _CLOSE            ;シンボルファイルのクローズ
  120.     addq.l    #2,sp
  121.     bra    asmmain9
  122.  
  123. asmmain8:
  124.     move.w    #STDOUT,(PRNHANDLE,a6)
  125.  
  126.     bsrl    makesymfile,d0        ;シンボルファイルを標準出力へ出力
  127. asmmain9:
  128.     DOS    _EXIT2
  129.  
  130.  
  131. ;----------------------------------------------------------------
  132. ;    アセンブラの表示メッセージ
  133. ;----------------------------------------------------------------
  134. main_crlf_msg:
  135.     .dc.b    CRLF,0
  136.  
  137. title_msg::
  138.     .dc.b    'X68k High-speed Assembler v',version
  139.     .dc.b    ' Copyright 1990-94/96-99 Y.Nakamura/M.Kamada',CRLF,0
  140.  
  141. usage_msg:
  142.     mes    '使用法: as [スイッチ] ファイル名'
  143.     .dc.b    CRLF
  144.     .dc.b    TAB,'-1',TAB,TAB
  145.     mes    '絶対ロング→PC間接(-b1と-eを伴う)'
  146.     .dc.b    CRLF
  147.     .dc.b    TAB,'-8',TAB,TAB
  148.     mes    'シンボルの識別長を8バイトにする'
  149.     .dc.b    CRLF
  150. ;-a 絶対ショートアドレス形式対応(-c2時のみ有効)
  151.     .dc.b    TAB,'-b[n]',TAB,TAB
  152.     mes    'PC間接→絶対ロング(0=[禁止],[1]=68000,2=MEM,3=1+2,4=ALL,5=1+4)'
  153.     .dc.b    CRLF
  154.     .dc.b    TAB,'-c[n]',TAB,TAB
  155.     mes    '最適化(0=禁止(-k1を伴う),1=(d,An)を禁止,[2]=v2互換,3=[v3互換],4=許可)'
  156.     .dc.b    CRLF
  157.     .dc.b    TAB,'-c<mnemonic>',TAB
  158.     mes    'software emulationの命令を展開する(FScc/MOVEP)'
  159.     .dc.b    CRLF
  160.     .dc.b    TAB,'-d',TAB,TAB
  161.     mes    'すべてのシンボルを外部定義にする'
  162.     .dc.b    CRLF
  163.     .dc.b    TAB,'-e',TAB,TAB
  164.     mes    '外部参照オフセットのデフォルトをロングワードにする'
  165.     .dc.b    CRLF
  166.     .dc.b    TAB,'-f[f,m,w,p]',TAB
  167.     mes    'リストファイルのフォーマット指定'
  168.     .dc.b    CRLF
  169.     .dc.b    TAB,TAB,TAB,TAB
  170.     mes    '(改ページ[1],マクロ展開[0],幅[136],ページ行数[58])'
  171.     .dc.b    CRLF
  172.     .dc.b    TAB,'-g',TAB,TAB
  173.     mes    'SCD用デバッグ情報の出力'
  174.     .dc.b    CRLF
  175.     .dc.b    TAB,'-i <path>',TAB
  176.     mes    'インクルードパス指定'
  177.     .dc.b    CRLF
  178.     .dc.b    TAB,'-j[n]',TAB,TAB
  179.     mes    'シンボルの上書き禁止条件の強化(bit0:[1]=SET,bit1:[1]=OFFSYM)'
  180.     .dc.b    CRLF
  181.     .dc.b    TAB,'-k[n]',TAB,TAB
  182.     mes    '68060のエラッタ対策(0=[する](-nは無効),[1]=しない)'
  183.     .dc.b    CRLF
  184.     .dc.b    TAB,'-l',TAB,TAB
  185.     mes    '起動時にタイトルを表示する'
  186.     .dc.b    CRLF
  187.     .dc.b    TAB,'-m <680x0|5x00>',TAB
  188.     mes    'アセンブル対象CPUの指定([68000]~68060/5200~5400)'
  189.     .dc.b    CRLF
  190.     .dc.b    TAB,'-n',TAB,TAB
  191.     mes    'パス1で確定できないサイズの最適化を省略する(-k1を伴う)'
  192.     .dc.b    CRLF
  193.     .dc.b    TAB,'-o <name>',TAB
  194.     mes    'オブジェクトファイル名'
  195.     .dc.b    CRLF
  196.     .dc.b    TAB,'-p [file]',TAB
  197.     mes    'リストファイル作成'
  198.     .dc.b    CRLF
  199. ;-q クイックイミディエイト形式への変換禁止(-c2時のみ有効)
  200. ;-r 相対セクション命令の許可(廃止)
  201.     .dc.b    TAB,'-s <n>',TAB,TAB
  202.     mes    '数字ローカルラベルの最大桁数の指定(1~[4])'
  203.     .dc.b    CRLF
  204.     .dc.b    TAB,'-s <symbol>[=n]',TAB
  205.     mes    'シンボルの定義'
  206.     .dc.b    CRLF
  207.     .dc.b    TAB,'-t <path>',TAB
  208.     mes    'テンポラリパス指定'
  209.     .dc.b    CRLF
  210.     .dc.b    TAB,'-u',TAB,TAB
  211.     mes    '未定義シンボルを外部参照にする'
  212.     .dc.b    CRLF
  213.     .dc.b    TAB,'-w[n]',TAB,TAB
  214.     mes    'ワーニングレベルの指定(0=全抑制,1,[2],3,4=[全通知])'
  215.     .dc.b    CRLF
  216.     .dc.b    TAB,'-x [file]',TAB
  217.     mes    'シンボルの出力'
  218.     .dc.b    CRLF
  219.     .dc.b    TAB,'-y[n]',TAB,TAB
  220.     mes    'プレデファインシンボル(0=[禁止],[1]=許可)'
  221.     .dc.b    CRLF
  222. ;-z HAS拡張機能のワーニング禁止(廃止)
  223.     mes    '    環境変数 HAS の内容がコマンドラインの手前に挿入されます'
  224.     .dc.b    CRLF
  225.     mes    '    環境変数 HAS の先頭が '
  226.     .dc.b    "'*'"
  227.     mes    ' のとき '
  228.     .dc.b    "'/'"
  229.     mes    ' をスイッチと見なしません'
  230.     .dc.b    CRLF
  231.     .dc.b    0
  232.  
  233. no_msg:        mes    'エラーはありません'
  234.         .dc.b    CRLF
  235.         .dc.b    0
  236. fatal_msg1:    mes    'エラーが '
  237.         .dc.b    0
  238. fatal_msg2:    mes    ' 個ありました.アセンブルを中止します'
  239.         .dc.b    CRLF
  240.         .dc.b    0
  241. env_has:    .dc.b    'HAS',0        ;コマンドラインに追加する環境変数名
  242. nulstr:        .dc.b    0
  243.     .even
  244.  
  245.  
  246. ;----------------------------------------------------------------
  247. ;    メモリ領域の確保
  248. ;----------------------------------------------------------------
  249. meminit:                    ;lea.l $10(a0),a0
  250.     move.l    #STACKBTM-asmmain+$F0,-(sp)    ;suba.l a0,a1
  251.     pea.l    ($10,a0)            ;movem.l a0-a1,-(sp)
  252.     DOS    _SETBLOCK        ;メモリブロックを解放
  253.     addq.l    #8,sp
  254.     tst.l    d0
  255.     bmi    nomemabort
  256. ;CMDLINEPTR(a6)の更新を_SETBLOCKのエラーチェック後に行う
  257.     addq.l    #1,a2
  258.     move.l    a2,(CMDLINEPTR,a6)    ;コマンドライン文字列へのポインタ
  259.     move.l    #$FFFFFF,-(sp)
  260.     DOS    _MALLOC            ;メモリを最大限確保
  261.     addq.l    #4,sp
  262.     tst.l    d0
  263.     bpl    meminit1        ;(こんなことはありえないが…)
  264.     and.l    #$FFFFFF,d0
  265.     move.l    d0,-(sp)
  266.     DOS    _MALLOC            ;あるだけのメモリを確保
  267.     addq.l    #4,sp
  268.     tst.l    d0
  269.     bmi    nomemabort        ;メモリが全く確保出来ない
  270. meminit1:
  271.     move.l    d0,(MEMPTR,a6)        ;未使用領域の開始アドレス
  272.     movea.l    d0,a0
  273.     move.l    (-8,a0),d0        ;         終了アドレス
  274.     sub.l    #$400,d0
  275.     move.l    d0,(MEMLIMIT,a6)
  276.     rts
  277.  
  278.  
  279. ;----------------------------------------------------------------
  280. ;    ワークエリアの初期化
  281. ;----------------------------------------------------------------
  282. workinit:
  283.     lea.l    (WORKCLRST,a6),a0
  284.     move.w    #(WORKSIZE-WORKCLRST)/2-1,d0
  285. workinit1:
  286.     clr.w    (a0)+
  287.     dbra    d0,workinit1
  288.     move.l    (MEMPTR,a6),(TEMPPTR,a6)
  289.  
  290.     clr.l    (INCLUDEPATH,a6)
  291.     lea.l    (nulstr,pc),a0
  292.     move.l    a0,(TEMPPATH,a6)
  293.     move.l    a0,(PRNTITLE,a6)
  294.     move.l    a0,(PRNSUBTTL,a6)
  295.  
  296.     move.w    #136,(PRNWIDTH,a6)
  297.     move.w    #58,(PRNPAGEL,a6)
  298.     move.w    #1,(PRNMPAGE,a6)
  299.     lea.l    (REQFILPTR,a6),a0
  300.     move.l    a0,(REQFILEND,a6)
  301.     move.l    #6,(NUMOFSECT,a6)
  302.     move.b    #-1,(WARNLEVEL,a6)
  303.  
  304.     move.w    #1<<9,(FPCPID,a6)
  305.  
  306.     move.w    #4,(LOCALLENMAX,a6)
  307.     move.w    #10000,(LOCALNUMMAX,a6)
  308.  
  309.     move.l    #SYMHASHTBL,d0
  310.     lea.l    (a6,d0.l),a0
  311.     move.l    a0,(SYMHASHPTR,a6)
  312.     move.l    #CMDHASHTBL,d0
  313.     lea.l    (a6,d0.l),a0
  314.     move.l    a0,(CMDHASHPTR,a6)
  315.  
  316.     clr.w    (SYMTBLCOUNT,a6)
  317.     lea.l    (SYMTBLBEGIN,a6),a0
  318.     clr.l    (a0)
  319.     move.l    a0,(SYMTBLCURBGN,a6)
  320.  
  321.     move.l    (TEMPPTR,a6),d0
  322.     doeven    d0            ;ロングワード境界に合わせる
  323.     move.l    (MEMLIMIT,a6),d1
  324.     sub.l    d0,d1            ;d1=未使用領域のサイズ
  325.     move.l    d1,d2
  326. ;    lsr.l    #2,d2            ;(未使用領域の1/4)
  327.     lsr.l    #1,d2            ;(未使用領域の1/2)
  328.     sub.l    d2,d1
  329.     and.l    #$FFFFE000,d1        ;d1=ファイルバッファに使用するメモリ
  330.     cmp.l    #8192,d1
  331.     bcc    workinit2
  332.     move.l    #8192,d1        ;メモリが不足している場合に最低限確保するバッファ
  333. workinit2:
  334.     lsr.l    #2,d1            ;1/4
  335.     move.l    d1,d2
  336.     lsr.l    #1,d1            ;1/8
  337.     add.l    d1,d2            ;ファイルバッファの3/8をソース用に充てる
  338.     move.l    d0,(F_BUFPTR+SOURCEPTR,a6)    ;ソースファイルバッファが決定
  339.     move.l    d2,(F_BUFLEN+SOURCEPTR,a6)
  340.     add.l    d2,d0
  341.     move.l    d0,(F_BUFPTR+TEMPFILPTR,a6)    ;テンポラリファイルバッファが決定
  342.     move.l    d2,(F_BUFLEN+TEMPFILPTR,a6)
  343.     add.l    d2,d0
  344.     move.l    d0,(F_BUFPTR+INCLDPTR,a6)    ;インクルードファイルバッファが決定
  345.     move.l    d1,(F_BUFLEN+INCLDPTR,a6)
  346.     add.l    d1,d0
  347.     move.l    d0,(F_BUFPTR+OBJFILPTR,a6)    ;オブジェクトファイルバッファが決定
  348.     move.l    d1,(F_BUFLEN+OBJFILPTR,a6)
  349.     add.l    d1,d0
  350.     move.l    d0,(TEMPPTR,a6)        ;それ以降がシンボル名・マクロ登録用ワーク
  351.  
  352.     bsr    memcheck
  353.     rts
  354.  
  355.  
  356. ;----------------------------------------------------------------
  357. ;    プレデファインシンボルの初期化
  358. ;----------------------------------------------------------------
  359. predefinesymbol:
  360.     tst.b    (PREDEFINE,a6)
  361.     beq    predefinesymbol99
  362.  
  363.     lea.l    (symbol_cpu,pc),a0
  364.     moveq.l    #ST_VALUE,d2        ;数値シンボル
  365.     bsr    defstrsymbol        ;新しく登録する
  366.     tst.b    (SYM_TYPE,a1)        ;cmpi.b #ST_VALUE,(SYM_TYPE,a1)
  367.                     ;シンボルのタイプ
  368.     bne    predefinesymbol1    ;定義できなかった(念のため)
  369.     move.l    a1,(CPUSYMBOL,a6)
  370.     move.b    #SA_PREDEFINE,(SYM_ATTRIB,a1)    ;プレデファインシンボル
  371.     clr.b    (SYM_SECTION,a1)    ;セクション番号
  372.     move.b    (CPUTYPE2,a6),d0
  373.     beq    predefinesymbol00
  374.     movea.l    #5200,a0
  375.     lsr.b    #1,d0
  376.     bcs    predefinesymbol0
  377.     lea.l    (5300-5200,a0),a0
  378.     lsr.b    #1,d0
  379.     bcs    predefinesymbol0
  380.     lea.l    (5400-5300,a0),a0
  381.     bra    predefinesymbol0
  382.  
  383. predefinesymbol00:
  384.     move.b    (CPUTYPE,a6),d0        ;CPUTYPEから初期値を決定する
  385.     movea.l    #68000,a0
  386.     lsr.b    #1,d0
  387.     bcs    predefinesymbol0
  388.     lea.l    (68010-68000,a0),a0
  389.     lsr.b    #1,d0
  390.     bcs    predefinesymbol0
  391.     lea.l    (68020-68010,a0),a0
  392.     lsr.b    #1,d0
  393.     bcs    predefinesymbol0
  394.     lea.l    (68030-68020,a0),a0
  395.     lsr.b    #1,d0
  396.     bcs    predefinesymbol0
  397.     lea.l    (68040-68030,a0),a0
  398.     lsr.b    #1,d0
  399.     bcs    predefinesymbol0
  400.     lea.l    (68060-68040,a0),a0
  401. predefinesymbol0:
  402.     move.l    a0,(SYM_VALUE,a1)    ;CPU
  403.     move.l    a0,(STARTCPU,a6)
  404. predefinesymbol1:
  405.  
  406.     pea.l    (symbol_date,pc)
  407.     moveq.l    #$07,d0
  408.     and.w    (ASSEMBLEDATE,a6),d0    ;|........|........|........|.....www|
  409.     lsl.w    #5,d0            ;|........|........|........|www.....|
  410.     swap.w    d0            ;|........|www.....|........|........|
  411.     move.w    (ASSEMBLEDATE+2,a6),d0    ;|........|www.....|yyyyyyym|mmmddddd|
  412.     add.l    #1980<<9,d0        ;|........|wwwYYYYY|YYYYYYYm|mmmddddd|
  413.     lsl.l    #7,d0            ;|.wwwYYYY|YYYYYYYY|mmmmdddd|d.......|
  414.     lsr.w    #4,d0            ;|.wwwYYYY|YYYYYYYY|....mmmm|ddddd...|
  415.     lsr.b    #3,d0            ;|.wwwYYYY|YYYYYYYY|....mmmm|...ddddd|
  416.     move.l    d0,-(sp)
  417.     bsr    def_predefinesymbol
  418.     pea.l    (symbol_time,pc)
  419.     move.l    (ASSEMBLETIM2,a6),-(sp)
  420.     bsr    def_predefinesymbol
  421.     lea.l    (8+8,sp),sp
  422.  
  423.     pea.l    (symbol_has,pc)
  424.     pea.l    (verno).w        ;309
  425.     bsr    def_predefinesymbol
  426.     pea.l    (symbol_has060,pc)
  427.     pea.l    (verno060).w        ;69~
  428.     bsr    def_predefinesymbol
  429.     lea.l    (8+8,sp),sp
  430.  
  431. predefinesymbol99:
  432.     rts
  433.  
  434. ;<4(sp).l:値
  435. ;<8(sp).l:文字列
  436. def_predefinesymbol:
  437.     movea.l    (8,sp),a0        ;文字列
  438.     moveq.l    #ST_VALUE,d2        ;数値シンボル
  439.     bsr    defstrsymbol        ;新しく登録する
  440.     tst.b    (SYM_TYPE,a1)        ;cmpi.b #ST_VALUE,(SYM_TYPE,a1)
  441.                     ;シンボルのタイプ
  442.     bne    def_predefinesymbol_9    ;定義できなかった(念のため)
  443.     move.b    #SA_PREDEFINE,(SYM_ATTRIB,a1)    ;プレデファインシンボル
  444.     clr.b    (SYM_SECTION,a1)    ;セクション番号
  445.     move.l    (4,sp),(SYM_VALUE,a1)    ;値
  446. def_predefinesymbol_9:
  447.     rts
  448.  
  449. symbol_cpu:    .dc.b    'CPU',0
  450. symbol_date:    .dc.b    '__DATE__',0
  451. symbol_time:    .dc.b    '__TIME__',0
  452. symbol_has:    .dc.b    '__HAS__',0
  453. symbol_has060:    .dc.b    '__HAS060__',0
  454.     .even
  455.  
  456.  
  457. ;----------------------------------------------------------------
  458. ;    CPUモードの初期化
  459. ;----------------------------------------------------------------
  460. cpuinit:
  461.     sf.b    (F43GTEST,a6)
  462. cpuinit1:
  463.     move.l    #~~cpu_68000-cpuinit1,d0
  464.     jmp    (cpuinit1,pc,d0.l)
  465.  
  466.  
  467. ;----------------------------------------------------------------
  468. ;    コマンドラインの解釈を行う
  469. ;----------------------------------------------------------------
  470. docmdline:
  471.     movea.l    (CMDLINEPTR,a6),a0
  472.     movea.l    (TEMPPTR,a6),a1
  473. ;環境変数HASをコマンドラインの手前に入れる
  474.     clr.b    (a1)
  475.     move.l    a1,-(sp)
  476.     clr.l    -(sp)
  477.     pea.l    (env_has,pc)
  478.     bsr    getenv
  479.     lea.l    (12,sp),sp
  480.     cmpi.b    #'*',(a1)
  481.     bne    docmdline1
  482.     move.b    #' ',(a1)
  483.     st.b    (SWITCHCHAR,a6)        ;環境変数の先頭に'*'があったら'/'をスイッチにしない
  484. docmdline1:
  485.     tst.b    (a1)+
  486.     bne    docmdline1
  487.     move.b    #' ',(-1,a1)        ;環境変数HASの後ろにコマンドラインをつなぐ
  488. docmdline2:
  489.     move.b    (a0)+,(a1)+
  490.     bne    docmdline2
  491.     movea.l    (TEMPPTR,a6),a0
  492.     move.l    a1,(TEMPPTR,a6)
  493. docmdline3:
  494.     bsr    optionsw
  495.     tst.b    d0
  496.     beq    docmdline10
  497.     subq.l    #1,a0
  498.     bsr    getcmdstring        ;ソースファイル名を得る
  499.     move.l    (SOURCEFILE,a6),d0
  500.     beq    docmdline39
  501.     cmp.l    (PRNFILE,a6),d0
  502.     beq    docmdline39
  503.     cmp.l    (SYMFILE,a6),d0
  504.     bne    usage            ;ソースファイル名が2つある
  505. docmdline39:
  506.     move.l    a1,(SOURCEFILE,a6)
  507.     bra    docmdline3
  508.  
  509. docmdline10:                ;コマンドラインが終了
  510.     move.l    (SOURCEFILE,a6),d2
  511.     beq    usage            ;ソースファイルの指定がないので使用法を表示
  512.     movea.l    d2,a0
  513.     cmp.l    (PRNFILE,a6),d2
  514.     bne    docmdline11
  515.     clr.l    (PRNFILE,a6)        ;-p [file]の形でソースファイルが指定された
  516. docmdline11:
  517.     cmp.l    (SYMFILE,a6),d2
  518.     bne    docmdline12
  519.     clr.l    (SYMFILE,a6)        ;-x [file]の形でソースファイルが指定された
  520. docmdline12:
  521.     bsr    getfilename
  522. docmdline122:
  523.     move.b    (a1)+,d0
  524.     beq    docmdline13
  525.     cmp.b    #'.',d0
  526.     bne    docmdline122
  527.     bra    docmdline14
  528.  
  529. docmdline13:                ;拡張子が省略された場合
  530.     movea.l    d2,a1
  531.     movea.l    (TEMPPTR,a6),a0
  532.     move.l    a0,(SOURCEFILE,a6)
  533.     clr.w    -(sp)            ;'r'
  534.     pea.l    (a0)
  535.     bsr    strcpy
  536.     move.b    #'.',(a0)+
  537.     movea.l    a0,a2
  538.     move.b    #'h',(a0)+
  539.     move.b    #'a',(a0)+
  540.     move.b    #'s',(a0)+
  541.     clr.b    (a0)+
  542.     DOS    _OPEN            ;拡張子'.has'でオープンしてみる
  543.     addq.l    #6,sp
  544.     tst.l    d0
  545.     bmi    docmdline135
  546.     move.w    d0,-(sp)
  547.     DOS    _CLOSE            ;ファイルがあったのでクローズ
  548.     addq.l    #2,sp
  549.     bra    docmdline139
  550.  
  551. docmdline135:                ;'.has'のファイルがないので拡張子は'.s'
  552.     move.b    #'s',(a2)+
  553.     clr.b    (a2)+
  554.     movea.l    a2,a0
  555. docmdline139
  556.     move.l    a0,(TEMPPTR,a6)
  557. docmdline14:
  558.     movea.l    (SOURCEFILE,a6),a0
  559.     bsr    getfilename        ;a1=ソースファイル名へのポインタ
  560.     lea.l    (SOURCENAME,a6),a0
  561.     bsr    tfrfilename
  562.     tst.l    (OBJFILE,a6)
  563.     bne    docmdline15
  564.     movea.l    (TEMPPTR,a6),a0        ;オブジェクトファイル名の指定がない
  565.     move.l    a0,(OBJFILE,a6)
  566.     bsr    tfrfilename
  567.     move.b    #'.',(a0)+
  568.     move.b    #'o',(a0)+
  569.     clr.b    (a0)+
  570.     move.l    a0,(TEMPPTR,a6)
  571. docmdline15:
  572.     tst.l    (PRNFILE,a6)
  573.     bne    docmdline99
  574.     movea.l    (TEMPPTR,a6),a0        ;PRNファイル名の指定がない
  575.     move.l    a0,(PRNFILE,a6)
  576.     bsr    tfrfilename
  577.     move.b    #'.',(a0)+
  578.     move.b    #'p',(a0)+
  579.     move.b    #'r',(a0)+
  580.     move.b    #'n',(a0)+
  581.     clr.b    (a0)+
  582.     move.l    a0,(TEMPPTR,a6)
  583. docmdline99:
  584.     tst.b    (COMPATMODE,a6)
  585.     beq    docmdline999
  586.     move.b    (COMPATSWA,a6),d0    ;HAS v2.x互換モードの場合,-a/-qスイッチを認識する
  587.     not.b    d0
  588.     move.b    d0,(NOABSSHORT,a6)
  589.     move.b    (COMPATSWQ,a6),(NOQUICK,a6)
  590. docmdline999:
  591.     rts
  592.  
  593. ;----------------------------------------------------------------
  594. ;    オプションスイッチの処理
  595. optionsw:
  596.     bsr    skipspc
  597.     move.b    (a0)+,d0
  598.     cmp.b    #'-',d0
  599.     beq    optionsw1
  600.     tst.b    (SWITCHCHAR,a6)
  601.     bne    optionsw0        ;'/'をスイッチに使用しない場合
  602.     cmp.b    #'/',d0
  603.     beq    optionsw1
  604. optionsw0:
  605.     rts
  606.  
  607. optionsw1:
  608.     move.b    (a0),d0
  609.     cmp.b    #' ',d0
  610.     bls    optionsw
  611.     addq.l    #1,a0
  612.     lea.l    (opt_switch,pc),a1
  613.     moveq.l    #-1,d2
  614.     cmp.b    #'Z',d0
  615.     bhi    optionsw2
  616.     cmp.b    #'A',d0
  617.     bcs    optionsw2
  618.     or.b    #$20,d0            ;小文字化
  619. optionsw2:
  620.     move.b    (a1)+,d1
  621.     beq    usage            ;該当するオプションスイッチがない
  622.     addq.w    #1,d2
  623.     cmp.b    d1,d0
  624.     bne    optionsw2
  625.     add.w    d2,d2
  626.     move.w    (optjp_tbl,pc,d2.w),d2
  627.     jsr    (optjp_tbl,pc,d2.w)
  628.     bra    optionsw1
  629.  
  630. ;----------------------------------------------------------------
  631. ;    オプションスイッチのジャンプテーブル
  632. opt_switch:
  633.     .dc.b    'toipnwud8msxaqflzregcb1ykj',0
  634.     .even
  635. optjp_tbl:
  636.     .dc.w    option_t-optjp_tbl,option_o-optjp_tbl
  637.     .dc.w    option_i-optjp_tbl,option_p-optjp_tbl
  638.     .dc.w    option_n-optjp_tbl,option_w-optjp_tbl
  639.     .dc.w    option_u-optjp_tbl,option_d-optjp_tbl
  640.     .dc.w    option_8-optjp_tbl,option_m-optjp_tbl
  641.     .dc.w    option_s-optjp_tbl,option_x-optjp_tbl
  642.     .dc.w    option_a-optjp_tbl,option_q-optjp_tbl
  643.     .dc.w    option_f-optjp_tbl,option_l-optjp_tbl
  644.     .dc.w    option_z-optjp_tbl,option_r-optjp_tbl
  645.     .dc.w    option_e-optjp_tbl,option_g-optjp_tbl
  646.     .dc.w    option_c-optjp_tbl,option_b-optjp_tbl
  647.     .dc.w    option_1-optjp_tbl
  648.     .dc.w    option_y-optjp_tbl
  649.     .dc.w    option_k-optjp_tbl
  650.     .dc.w    option_j-optjp_tbl
  651.  
  652. ;----------------------------------------------------------------
  653. ;    -t path        テンポラリパス指定
  654. option_t:
  655.     bsr    skipspc
  656.     bsr    getcmdstring
  657.     move.l    a1,(TEMPPATH,a6)
  658.     rts
  659.  
  660. ;----------------------------------------------------------------
  661. ;    -i path        インクルードパス指定
  662. option_i:
  663.     lea.l    (INCLUDEPATH,a6),a1
  664. option_i1:
  665.     move.l    (a1),d0            ;パス名チェインを1つたどる
  666.     bne    option_i2
  667.     move.l    (TEMPPTR,a6),d0        ;チェインの終端
  668.     addq.l    #1,d0
  669.     bclr.l    #0,d0
  670.     move.l    d0,(a1)            ;1つチェインを追加する
  671.     move.l    d0,a1
  672.     clr.l    (a1)
  673.     addq.l    #4,d0
  674.     move.l    d0,(TEMPPTR,a6)
  675.     bsr    skipspc
  676.     bsr    getcmdstring        ;パス名を得る
  677.     rts
  678.  
  679. option_i2:
  680.     movea.l    d0,a1
  681.     bra    option_i1
  682.  
  683. ;----------------------------------------------------------------
  684. ;    -o name        オブジェクトファイル名
  685. option_o:
  686.     bsr    skipspc
  687.     bsr    getcmdstring
  688.     move.l    a1,(OBJFILE,a6)
  689.     move.l    a0,-(sp)        ;パスをスキップしてから'.'を検索する
  690.     movea.l    a1,a0
  691.     bsr    getfilename
  692.     movea.l    (sp)+,a0
  693. option_o1:
  694.     move.b    (a1)+,d0
  695.     beq    option_o2
  696.     cmp.b    #'.',d0
  697.     bne    option_o1
  698.     rts
  699.  
  700. option_o2:                ;拡張子が省略されたら.oを加える
  701.     move.b    #'.',(-1,a1)
  702.     move.b    #'o',(a1)+
  703.     clr.b    (a1)+
  704.     move.l    a1,(TEMPPTR,a6)
  705.     rts
  706.  
  707. ;----------------------------------------------------------------
  708. ;    -p [file]    リストファイル作成
  709. option_p:
  710.     st.b    (MAKEPRN,a6)
  711.     lea.l    (PRNFILE,a6),a2
  712. option_p1:
  713.     move.b    (a0),d0
  714.     beq    option_p2
  715.     cmp.b    #' ',d0
  716.     bls    option_p3
  717.     bsr    getcmdstring        ;-p[file]の場合
  718.     move.l    a1,(a2)
  719. option_p2:
  720.     rts
  721.  
  722. option_p3:                ;-p [file]の場合(ソースファイル名の可能性有り)
  723.     bsr    skipspc
  724.     move.b    (a0),d0
  725.     beq    option_p2
  726.     cmp.b    #'-',d0
  727.     beq    option_p9
  728.     tst.b    (SWITCHCHAR,a6)
  729.     bne    option_p4        ;'/'をスイッチに使用しない場合
  730.     cmp.b    #'/',d0
  731.     beq    option_p9
  732. option_p4:
  733.     bsr    getcmdstring
  734.     move.l    a1,(a2)
  735.     tst.l    (SOURCEFILE,a6)
  736.     bne    option_p2
  737.     move.l    a1,(SOURCEFILE,a6)
  738.     rts
  739.  
  740. option_p9:
  741.     subq.l    #1,a0
  742.     rts
  743.  
  744. ;----------------------------------------------------------------
  745. ;    -x [file]    シンボルファイル作成
  746. option_x:
  747.     st.b    (MAKESYM,a6)
  748.     lea.l    (SYMFILE,a6),a2
  749.     bra    option_p1
  750.  
  751. ;----------------------------------------------------------------
  752. ;    -s symbol[=num]    シンボルの定義
  753. option_s:
  754.     bsr    skipspc
  755.     bsr    getcmdnum
  756.     bmi    option_s02
  757. ;シンボルの先頭が数字で1~4以外のときはエラー
  758.     move.l    d1,d0
  759.     beq    usage            ;0
  760.     subq.l    #4,d1
  761.     bhi    usage            ;5以上
  762.     cmpi.b    #'=',(a0)
  763.     beq    usage
  764.     move.w    d0,(LOCALLENMAX,a6)    ;最大桁数
  765.     add.w    d0,d0
  766.     move.w    (option_s01-2,pc,d0.w),(LOCALNUMMAX,a6)    ;最大番号+1
  767.     rts
  768.  
  769. option_s01:
  770.     .dc.w    10,100,1000,10000
  771.  
  772. option_s02:
  773.     cmpi.b    #'=',(a0)
  774.     beq    usage
  775.     move.w    #'=',-(sp)
  776.     bsr    getcmdstring_stop
  777.     addq.l    #2,sp
  778.     move.l    a1,a2
  779.     moveq.l    #0,d1
  780.     moveq.l    #0,d2
  781.     moveq.l    #0,d7
  782.     cmpi.b    #'=',(a0)
  783.     bne    option_s1
  784.     addq.l    #1,a0            ;=num の指定があった
  785.     cmpi.b    #'-',(a0)
  786.     bne    option_s0
  787.     st.b    d7
  788.     addq.l    #1,a0
  789. option_s0:
  790.     bsr    getcmdnum
  791.     bmi    usage            ;数値が得られない
  792.     tst.b    d7
  793.     beq    option_s1
  794.     neg.l    d1
  795. option_s1:
  796.     move.l    a0,-(sp)
  797.     move.l    d1,-(sp)
  798.     movea.l    a2,a0
  799.     moveq.l    #ST_VALUE,d2        ;数値シンボル
  800.     bsr    defstrsymbol        ;新しく登録する
  801.     tst.b    (SYM_TYPE,a1)        ;cmpi.b #ST_VALUE,(SYM_TYPE,a1)
  802.                     ;シンボルのタイプ
  803.     bne    usage            ;タイプの異なるシンボルと重複している
  804.     move.b    #SA_DEFINE,(SYM_ATTRIB,a1)    ;定義済シンボル
  805.     clr.b    (SYM_SECTION,a1)    ;セクション番号
  806.     move.l    (sp)+,(SYM_VALUE,a1)    ;シンボル値
  807.     movea.l    (sp)+,a0
  808.     rts
  809.  
  810. ;----------------------------------------------------------------
  811. ;    -f        リストファイルのフォーマット指定
  812. option_f:
  813.     movea.l    a0,a1
  814.     bsr    getcmdnum
  815.     beq    option_f1
  816.     cmpi.b    #',',(a0)
  817.     beq    option_f2
  818.     st.b    (NOPAGEFF,a6)        ;-f のみならページング禁止
  819.     movea.l    a1,a0
  820.     rts
  821.  
  822. option_f1:
  823.     tst.l    d1
  824.     seq.b    (NOPAGEFF,a6)        ;ページングモード
  825. option_f2:
  826.     bsr    getnextnum
  827.     tst.w    d0
  828.     bmi    option_f3
  829.     tst.l    d1
  830.     sne.b    (ISLALL,a6)        ;マクロ展開モード
  831. option_f3:
  832.     bsr    getnextnum
  833.     tst.w    d0
  834.     bmi    option_f4
  835.     cmp.l    #256,d1
  836.     bcc    usage
  837.     cmp.w    #80,d1
  838.     bcs    usage
  839.     and.w    #$FFF8,d1
  840.     move.w    d1,(PRNWIDTH,a6)    ;表示幅
  841. option_f4:
  842.     bsr    getnextnum
  843.     tst.w    d0
  844.     bmi    option_f5
  845.     cmp.l    #256,d1
  846.     bcc    usage
  847.     cmp.w    #10,d1
  848.     bcs    usage
  849.     move.w    d1,(PRNPAGEL,a6)    ;ページ行数
  850. option_f5:
  851.     rts
  852.  
  853. ;----------------------------------------------------------------
  854. ;    -w [level]    ワーニング出力レベルの指定
  855. option_w:
  856.     movea.l    a0,a1
  857.     bsr    getcmdnum
  858.     beq    option_w1
  859.     move.b    #2,(WARNLEVEL,a6)    ;-w のみ…ワーニング出力レベルは2
  860.     movea.l    a1,a0
  861.     rts
  862.  
  863. option_w1:
  864.     cmp.l    #4,d1
  865.     bhi    usage
  866.     move.b    d1,(WARNLEVEL,a6)
  867.     rts
  868.  
  869. ;----------------------------------------------------------------
  870. ;    -n        最適化の禁止
  871. option_n:
  872.     st.b    (OPTIMIZE,a6)
  873.     st.b    (IGNORE_ERRATA,a6)
  874.     sf.b    (F43GTEST,a6)
  875.     rts
  876.  
  877. ;----------------------------------------------------------------
  878. ;    -u        未定義シンボルを外部参照にする
  879. option_u:
  880.     st.b    (ALLXREF,a6)
  881.     rts
  882.  
  883. ;----------------------------------------------------------------
  884. ;    -d        すべてのシンボルを外部定義にする
  885. option_d:
  886.     st.b    (ALLXDEF,a6)
  887.     rts
  888.  
  889. ;----------------------------------------------------------------
  890. ;    -8        シンボルの識別長を8バイトにする
  891. option_8:
  892.     st.b    (SYMLEN8,a6)
  893.     rts
  894.  
  895. ;----------------------------------------------------------------
  896. ;    -l        起動時にタイトルを表示する
  897. option_l:
  898.     st.b    (DISPTITLE,a6)
  899.     rts
  900.  
  901. ;----------------------------------------------------------------
  902. ;    -e        外部参照オフセットのデフォルトをロングワードにする
  903. option_e:
  904.     st.b    (EXTSHORT,a6)
  905.     bra68    d0,option_e1        ;68000/68010ならフラグセットのみ
  906.     st.b    (EXTSIZEFLG,a6)
  907.     move.b    #SZ_LONG,(EXTSIZE,a6)
  908.     move.l    #4,(EXTLEN,a6)
  909. option_e1:
  910.     rts
  911.  
  912. ;----------------------------------------------------------------
  913. ;    -g        SCD.X用デバッグ情報を出力する
  914. option_g:
  915.     st.b    (MAKESYMDEB,a6)
  916.     rts
  917.  
  918. ;----------------------------------------------------------------
  919. ;    -c        HAS v2.xと互換のある最適化を行う
  920. option_c:
  921.     bsr    getcmdnum
  922.     bmi    option_c_x        ;-cの直後が数字でない
  923.     subq.l    #1,d1
  924.     bcs    option_c_0
  925.     beq    option_c_1
  926.     subq.l    #2,d1
  927.     bcs    option_c_2
  928.     beq    option_c_3
  929.     subq.l    #2,d1
  930.     bcc    usage            ;0~4でない
  931. ;-c4 すべての最適化を許可
  932. option_c_4:
  933.     sf.b    (OPTIMIZE,a6)        ;前方参照の最適化を許可
  934. ;拡張された最適化を許可
  935.     st.b    (OPTCLR,a6)        ;CLRを最適化する
  936.     st.b    (OPTMOVEA,a6)        ;MOVEAを最適化する
  937.     st.b    (OPTADDASUBA,a6)    ;ADDA/CMPA/SUBAを最適化する
  938.     st.b    (OPTCMPA,a6)        ;ADDA/CMPA/SUBAを最適化する
  939.     st.b    (OPTLEA,a6)        ;LEAを最適化する
  940.     st.b    (OPTASL,a6)        ;ASLを最適化する
  941.     st.b    (OPTCMP0,a6)        ;CMP.bwl #0,Dn→TST.bwl Dn
  942.     st.b    (OPTMOVE0,a6)        ;MOVE.bw #0,Dn→CLR.bw Dn
  943.     st.b    (OPTCMPI0,a6)        ;CMPI.bwl #0,<ea>→TST.bwl <ea>
  944.     st.b    (OPTSUBADDI0,a6)    ;ADDI/SUBI #d3,<ea>→ADDQ/SUBQ #d3,<ea>
  945.     st.b    (OPTBSR,a6)        ;直後へのbsrをpeaにする
  946.     st.b    (OPTJMPJSR,a6)        ;jmp/jsrを最適化する
  947. ;v2互換を解除
  948. option_c_2off:
  949.     sf.b    (COMPATMODE,a6)        ;v2非互換
  950.     sf.b    (NOABSSHORT,a6)        ;絶対ショートへの変換を許可
  951.     sf.b    (NOQUICK,a6)        ;クイックイミディエイトへの変換を許可
  952.     sf.b    (NONULDISP,a6)        ;ディスプレースメントの削除を許可
  953.     sf.b    (NOBRACUT,a6)        ;分岐命令の削除を許可
  954.     rts
  955.  
  956. ;-c3 v3互換
  957. option_c_3:
  958.     bsr    option_c_2off        ;v2互換を解除
  959.     bra    option_c_exoff        ;拡張された最適化を禁止
  960.  
  961. ;-c2 v2互換
  962. option_c_2:
  963.     st.b    (COMPATMODE,a6)        ;NOABSSHORTとNOQUICKは-aと-qで決定する
  964.     st.b    (NONULDISP,a6)
  965.     st.b    (NOBRACUT,a6)
  966.     bra    option_c_exoff        ;拡張された最適化を禁止
  967.  
  968. ;-c1 (d,An)の最適化を禁止
  969. option_c_1:
  970.     st.b    (NONULDISP,a6)
  971.     rts
  972.  
  973. ;-c0 すべての最適化を禁止
  974. option_c_0:
  975.     st.b    (OPTIMIZE,a6)        ;前方参照の最適化を禁止
  976.     st.b    (IGNORE_ERRATA,a6)
  977.     sf.b    (F43GTEST,a6)
  978.     sf.b    (COMPATMODE,a6)        ;v2非互換
  979.     st.b    (NOABSSHORT,a6)        ;絶対ショートへの変換を禁止
  980.     st.b    (NOQUICK,a6)        ;クイックイミディエイトへの変換を禁止
  981.     st.b    (NONULDISP,a6)        ;ディスプレースメントの削除を禁止
  982.     st.b    (NOBRACUT,a6)        ;分岐命令の削除を禁止
  983. ;拡張された最適化を禁止
  984. option_c_exoff:
  985.     sf.b    (OPTCLR,a6)        ;CLRを最適化する
  986.     sf.b    (OPTMOVEA,a6)        ;MOVEAを最適化する
  987.     sf.b    (OPTADDASUBA,a6)    ;ADDA/CMPA/SUBAを最適化する
  988.     sf.b    (OPTCMPA,a6)        ;ADDA/CMPA/SUBAを最適化する
  989.     sf.b    (OPTLEA,a6)        ;LEAを最適化する
  990.     sf.b    (OPTASL,a6)        ;ASLを最適化する
  991.     sf.b    (OPTCMP0,a6)        ;CMP.bwl #0,Dn→TST.bwl Dn
  992.     sf.b    (OPTMOVE0,a6)        ;MOVE.bw #0,Dn→CLR.bw Dn
  993.     sf.b    (OPTCMPI0,a6)        ;CMPI.bwl #0,<ea>→TST.bwl <ea>
  994.     sf.b    (OPTSUBADDI0,a6)    ;ADDI/SUBI #d3,<ea>→ADDQ/SUBQ #d3,<ea>
  995.     sf.b    (OPTBSR,a6)        ;直後へのbsrをpeaにする
  996.     sf.b    (OPTJMPJSR,a6)        ;jmp/jsrを最適化する
  997.     rts
  998.  
  999. option_c_x::
  1000.     move.b    (a0),d0
  1001.     cmp.b    #' ',d0
  1002.     bls    option_c_2
  1003. option_c_x0:
  1004.     move.l    (TEMPPTR,a6),d0
  1005.     addq.l    #1,d0
  1006.     and.b    #$FE,d0
  1007.     movea.l    d0,a1
  1008.     moveq.l    #15-1,d1        ;最大15文字
  1009. option_c_x1:
  1010.     move.b    (a0)+,d0
  1011.     cmp.b    #'0',d0
  1012.     blo    option_c_x2
  1013.     cmp.b    #'9',d0
  1014.     bls    option_c_x11
  1015.     cmp.b    #'A',d0
  1016.     blo    option_c_x2
  1017.     cmp.b    #'Z',d0
  1018.     bls    option_c_x10
  1019.     cmp.b    #'a',d0
  1020.     blo    option_c_x2
  1021.     cmp.b    #'z',d0
  1022.     bhi    option_c_x2
  1023. ;    bra    option_c_x11
  1024.  
  1025. option_c_x10:
  1026.     or.b    #$20,d0
  1027. option_c_x11:
  1028.     move.b    d0,(a1)+
  1029.     dbra    d1,option_c_x1
  1030.     bra    usage            ;長すぎる
  1031.  
  1032. option_c_x2:
  1033.     subq.l    #1,a0
  1034.     clr.b    (a1)
  1035.     move.l    (TEMPPTR,a6),d0
  1036.     addq.l    #1,d0
  1037.     and.b    #$FE,d0
  1038.     movea.l    d0,a1
  1039. ;-cfscc[=6]
  1040.     cmpi.l    #'fscc',(a1)        ;a1をインクリメントしないこと
  1041.     bne    option_c_x3
  1042.     tst.b    (4,a1)
  1043.     bne    option_c_x3
  1044. ;FScc→FBcc
  1045.     lea.l    (X_FSCC,a6),a1        ;FScc展開
  1046.     bra    option_c_y
  1047.  
  1048. option_c_x3:
  1049. ;-cmovep[=6]
  1050.     cmpi.l    #'move',(a1)        ;a1をインクリメントしないこと
  1051.     bne    option_c_x4
  1052.     cmpi.w    #'p'<<8,(4,a1)
  1053.     bne    option_c_x4
  1054. ;MOVEP→MOVE
  1055.     lea.l    (X_MOVEP,a6),a1
  1056. option_c_y:
  1057.     st.b    (a1)            ;すべて展開する
  1058.     move.b    (a0)+,d0
  1059.     cmp.b    #'=',d0
  1060.     bne    option_c_x96
  1061.     cmpi.b    #'6',(a0)+
  1062.     bne    usage
  1063.     move.w    #C060,(a1)        ;68060のときだけ展開する
  1064.     bra    option_c_x99
  1065.  
  1066. option_c_x4:
  1067.  
  1068. ;-cfximm
  1069. ;F<op>.X #imm,FPn→(d,PC)
  1070.  
  1071. ;-cfmovecr
  1072. ;FMOVECR.X #imm,FPn→(d,PC)
  1073.  
  1074. ;-call[=6]
  1075.     cmpi.l    #'all'<<8,(a1)
  1076.     bne    usage
  1077. ;ALL
  1078.     st.b    d0            ;moveq.l #-1,d0は不可
  1079.     cmpi.b    #'=',(a0)
  1080.     bne    option_c_x95
  1081.     addq.l    #1,a0
  1082.     cmpi.b    #'6',(a0)+
  1083.     bne    usage
  1084.     move.w    #C060,d0        ;68060のときだけ
  1085. option_c_x95:
  1086.     move.w    d0,(X_FSCC,a6)        ;FScc展開
  1087.     move.w    d0,(X_MOVEP,a6)        ;MOVEP展開
  1088. option_c_x99:
  1089.     move.b    (a0)+,d0
  1090. option_c_x96:
  1091.     cmp.b    #' ',d0
  1092.     bls    option_c_x97        ;0を含むのでa0をデクリメントしてから終了
  1093.     cmp.b    #',',d0
  1094.     bne    usage
  1095.     bra    option_c_x0
  1096.  
  1097. option_c_x97:
  1098.     subq.l    #1,a0
  1099. option_c_x98:
  1100.     rts
  1101.  
  1102. ;----------------------------------------------------------------
  1103. ;    -b[n]        PC間接→絶対ロング([1]=68000,2=mem,3=1+2,4=all,5=1+4)
  1104. ;                0    [禁止]
  1105. ;                [1]    (bd,PC)/Bcc.L    68000コード生成
  1106. ;                2    (d,PC)<mem>    i-cache回避(lea/pea以外)
  1107. ;                3    1+2
  1108. ;                4    (d,PC)<all>    デバッグ用
  1109. ;                5    1+4
  1110. option_b:
  1111.     bsr    getcmdnum
  1112.     bmi    option_b1
  1113.     subq.l    #1,d1
  1114.     bcs    option_b0
  1115.     beq    option_b1
  1116.     subq.l    #2,d1
  1117.     bcs    option_b2
  1118.     beq    option_b3
  1119.     subq.l    #2,d1
  1120.     bcs    option_b4
  1121.     bne    usage            ;0~5でない
  1122. option_b5:
  1123.     bsr    option_b4_1
  1124.     bsr    option_b2_1        ;5→7(allはmemを含む)
  1125. option_b1_1:
  1126.     st.b    (LONGABS,a6)
  1127.     st.b    (BRATOJBRA,a6)
  1128.     rts
  1129.  
  1130. option_b4:
  1131.     bsr    option_b2_1        ;4→6(allはmemを含む)
  1132.     bsr    option_b1_0
  1133. option_b4_1:
  1134.     sf.b    (PCTOABSLNOTALL,a6)
  1135.     rts
  1136.  
  1137. option_b3:
  1138.     bsr    option_b4_0
  1139.     bsr    option_b1_1
  1140. option_b2_1:
  1141.     st.b    (PCTOABSL,a6)
  1142.     rts
  1143.  
  1144. option_b2:
  1145.     bsr    option_b4_0
  1146.     bsr    option_b2_1
  1147. option_b1_0:
  1148.     sf.b    (LONGABS,a6)
  1149.     sf.b    (BRATOJBRA,a6)
  1150.     rts
  1151.  
  1152. option_b1:
  1153.     bsr    option_b4_0
  1154.     bsr    option_b1_1
  1155. option_b2_0:
  1156.     sf.b    (PCTOABSL,a6)
  1157.     rts
  1158.  
  1159. option_b0:
  1160.     bsr    option_b2_0
  1161.     bsr    option_b1_0
  1162. option_b4_0:
  1163.     st.b    (PCTOABSLNOTALL,a6)
  1164.     rts
  1165.  
  1166. ;----------------------------------------------------------------
  1167. ;    -m nn        CPUモードの指定
  1168. option_m:
  1169.     bsr    skipspc
  1170.     bsr    getcmdnum
  1171.     bmi    usage
  1172.     cmp.l    #68000,d1
  1173.     beq    ~~cpu_68000
  1174.     cmp.l    #68010,d1
  1175.     beq    ~~cpu_68010
  1176.     cmp.l    #68020,d1
  1177.     beq    ~~cpu_68020
  1178.     cmp.l    #68030,d1
  1179.     beq    ~~cpu_68030
  1180.     cmp.l    #68040,d1
  1181.     beq    ~~cpu_68040
  1182.     cmp.l    #68060,d1
  1183.     beq    ~~cpu_68060
  1184.     cmp.l    #5200,d1
  1185.     beq    ~~cpu_5200
  1186.     cmp.l    #5300,d1
  1187.     beq    ~~cpu_5300
  1188.     cmp.l    #5400,d1
  1189.     beq    ~~cpu_5400
  1190.  
  1191.     cmp.l    #1000,d1
  1192.     bls    usage
  1193.     cmp.l    #32768,d1
  1194.     bcc    usage
  1195.     rts                ;その他の数値(最大シンボル数指定)は何もしない
  1196.  
  1197. ;----------------------------------------------------------------
  1198. ;    -j[n]
  1199. option_j:
  1200.     bsr    getcmdnum
  1201.     bpl    option_j_1
  1202.     moveq.l    #-1,d1
  1203. option_j_1:
  1204.     lsr.l    #1,d1
  1205.     scs.b    (OWSET,a6)
  1206.     lsr.l    #1,d1
  1207.     scs.b    (OWOFFSYM,a6)
  1208. ;無効なビットはエラーではなく無視する
  1209.     rts
  1210.  
  1211. ;----------------------------------------------------------------
  1212. ;    -k    エラッタの対策を禁止する
  1213. option_k:
  1214.     bsr    getcmdnum
  1215.     bmi    option_k_1
  1216.     cmp.l    #1,d1
  1217.     bhi    usage
  1218.     beq    option_k_1
  1219. option_k_0:
  1220.     sf.b    (IGNORE_ERRATA,a6)
  1221.     sf.b    (OPTIMIZE,a6)
  1222.     rts
  1223.  
  1224. option_k_1:
  1225.     st.b    (IGNORE_ERRATA,a6)
  1226.     sf.b    (F43GTEST,a6)
  1227.     rts
  1228.  
  1229. ;----------------------------------------------------------------
  1230. ;    -1        絶対ロングをoptional PC間接にする
  1231. option_1:
  1232.     st.b    (ABSLTOOPC,a6)        ;絶対ロングをoptional PC間接にする
  1233.     bsr    option_e
  1234.     bra    option_b1
  1235.  
  1236. ;----------------------------------------------------------------
  1237. ;    -y[n]        プレデファインシンボル制御(0=[禁止],[1]=許可)
  1238. option_y:
  1239.     bsr    getcmdnum
  1240.     bmi    option_y_1
  1241.     subq.l    #1,d1
  1242.     bcs    option_y_0
  1243.     bne    usage
  1244. option_y_1:
  1245.     st.b    (PREDEFINE,a6)
  1246.     rts
  1247.  
  1248. option_y_0:
  1249.     sf.b    (PREDEFINE,a6)
  1250.     rts
  1251.  
  1252.  
  1253. ;----------------------------------------------------------------
  1254. ;    (ダミーのオプションスイッチ)
  1255.  
  1256. ;    -a        絶対ショートアドレス形式対応モード
  1257. option_a:
  1258.     st.b    (COMPATSWA,a6)
  1259.     rts
  1260.  
  1261. ;    -q        クイックイミディエイト形式への変換禁止
  1262. option_q:
  1263.     st.b    (COMPATSWQ,a6)
  1264. ;    -z        HAS拡張機能のワーニング禁止
  1265. option_z:
  1266. ;    -r        相対セクション命令を許可する
  1267. option_r:
  1268.     rts
  1269.  
  1270. ;----------------------------------------------------------------
  1271. ;    コマンドラインから文字列を得る
  1272. getcmdstring:
  1273.     clr.w    -(sp)
  1274.     bsr    getcmdstring_stop
  1275.     addq.l    #2,sp
  1276.     rts
  1277.  
  1278. getcmdstring_stop:
  1279.     tst.b    (a0)
  1280.     beq    usage
  1281.     movea.l    (TEMPPTR,a6),a1
  1282.     move.l    a1,-(sp)
  1283. getcmdstring1:
  1284.     move.b    (a0)+,d0
  1285.     cmp.b    #' ',d0
  1286.     bls    getcmdstring2
  1287.     cmp.b    (4+4+1,sp),d0
  1288.     beq    getcmdstring2
  1289.     move.b    d0,(a1)+
  1290.     bra    getcmdstring1
  1291.  
  1292. getcmdstring2:
  1293.     subq.l    #1,a0
  1294.     clr.b    (a1)+
  1295.     move.l    a1,(TEMPPTR,a6)
  1296.     move.l    (sp)+,a1
  1297.     rts
  1298.  
  1299. ;----------------------------------------------------------------
  1300. ;    コマンドラインの数値を得る
  1301. getcmdnum:
  1302.     movem.l    a0-a1,-(sp)
  1303.     bsrl    getnum,d0
  1304.     beq    getcmdnum9
  1305.     movem.l    (sp)+,a0-a1
  1306.     moveq.l    #-1,d0
  1307.     rts
  1308.  
  1309. getcmdnum9:
  1310.     addq.l    #4,sp
  1311.     movea.l    (sp)+,a1
  1312.     moveq.l    #0,d0
  1313.     rts
  1314.  
  1315. ;----------------------------------------------------------------
  1316. ;    コマンドラインの次の数値を得る
  1317. getnextnum:
  1318.     cmpi.b    #',',(a0)+
  1319.     beq    getcmdnum
  1320.     subq.l    #1,a0
  1321.     addq.l    #4,sp
  1322.     rts                ;呼び出したサブルーチンをリターン
  1323.  
  1324. ;----------------------------------------------------------------
  1325. ;    拡張子を取り除いたファイル名を転送する
  1326. tfrfilename:
  1327.     move.l    a1,-(sp)
  1328. tfrfilename1:
  1329.     move.b    (a1)+,d0
  1330.     beq    tfrfilename9
  1331.     cmp.b    #'.',d0
  1332.     beq    tfrfilename9
  1333.     move.b    d0,(a0)+
  1334.     bra    tfrfilename1
  1335.  
  1336. tfrfilename9:
  1337.     clr.b    (a0)
  1338.     move.l    (sp)+,a1
  1339.     rts
  1340.  
  1341. ;----------------------------------------------------------------
  1342. ;    使用法を表示して終了する
  1343. usage:
  1344.     lea.l    (title_msg,pc),a0
  1345.     bsr    printmsg
  1346.     lea.l    (usage_msg,pc),a0
  1347.     bsr    printmsg
  1348.     move.w    #1,-(sp)
  1349.     DOS    _EXIT2
  1350.  
  1351.  
  1352. ;----------------------------------------------------------------
  1353.     .end    asmmain
  1354.  
  1355. ;----------------------------------------------------------------
  1356. ;    $Log: main.s,v $
  1357. ;    Revision 3.8  1999 10/ 8(Fri) 17:33:03 M.Kamada
  1358. ;    +86 改行コードの変更に対応
  1359. ;    +86 EUC対応準備
  1360. ;
  1361. ;    Revision 3.7  1999  3/19(Fri) 16:18:43 M.Kamada
  1362. ;    +83 -o./fooのとき.oが補完されなかった
  1363. ;    +83 "致命的な"を除去
  1364. ;    +83 使用法に環境変数HASの先頭が'*'の場合について記述
  1365. ;    +83 数字ローカルラベルの最大桁数を4桁まで選択可能
  1366. ;
  1367. ;    Revision 3.6  1999  3/ 3(Wed) 14:39:51 M.Kamada
  1368. ;    +82 ヘルプメッセージのスイッチの並び順を変更
  1369. ;    +82 Fatal error(s)メッセージを日本語化
  1370. ;    +82 使用法の -f や -w の表示を変更
  1371. ;    +82 doeven→doquad
  1372. ;
  1373. ;    Revision 3.5  1999  2/27(Sat) 23:42:45 M.Kamada
  1374. ;    +81 ソースリストのフォーマットを変更(実行ファイルは+80とまったく同じ)
  1375. ;
  1376. ;    Revision 3.4  1999  2/25(Thu) 05:02:40 M.Kamada
  1377. ;    +80 Copyright表示が-98になっていた
  1378. ;    +80 ColdFire対応
  1379. ;    +80 .offsym <初期値>,<シンボル>
  1380. ;    +80 setでset以外で定義されたシンボルの上書き禁止
  1381. ;
  1382. ;    Revision 3.3  1999  2/13(Sat) 20:35:01 M.Kamada
  1383. ;    +79 .R形式にするとメモリが極端に不足しているとき直後のブロックを破壊する可能性がある
  1384. ;    +79 メモリが極端に不足しているときバスエラーが出る可能性がある
  1385. ;    +79 コマンドラインに'='で始まる単語があるとハングアップする
  1386. ;    +79 ソースファイル名が2つあるときエラーにする
  1387. ;
  1388. ;    Revision 3.2  1998 11/19(Thu) 23:46:21 M.Kamada
  1389. ;    +78 -k0と-nを併用すると誤動作するため後から指定した方を有効にする
  1390. ;
  1391. ;    Revision 3.1  1998  7/14(Tue) 02:43:56 M.Kamada
  1392. ;    +69 プレデファインシンボル__HAS__と__HAS060__を追加
  1393. ;    +69 crlf_msgを内蔵
  1394. ;
  1395. ;    Revision 3.0  1998  5/24(Sun) 18:28:43 M.Kamada
  1396. ;    +66 -y[n]のnを書くと常に-y0になる不具合を修正
  1397. ;
  1398. ;    Revision 2.9  1998  4/13(Mon) 04:51:03 M.Kamada
  1399. ;    +64 エラッタの対策を禁止するスイッチを追加
  1400. ;
  1401. ;    Revision 2.8  1998  3/31(Tue) 02:09:02 M.Kamada
  1402. ;    +63 jmp/jsrを最適化する
  1403. ;
  1404. ;    Revision 2.7  1998  1/25(Sun) 21:53:31 M.Kamada
  1405. ;    +58 逆条件ニモニックとelifを追加
  1406. ;
  1407. ;    Revision 2.6  1998  1/ 9(Fri) 22:22:27 M.Kamada
  1408. ;    +56 -f43gを削除
  1409. ;
  1410. ;    Revision 2.5  1998  1/ 5(Mon) 01:10:43 M.Kamada
  1411. ;    +55 -b[n]
  1412. ;    +55 -1をg2asに合わせる
  1413. ;    +55 ヘルプの命令を大文字に
  1414. ;
  1415. ;    Revision 2.4  1997 10/28(Tue) 02:53:25 M.Kamada
  1416. ;    +52 -callの直後の1文字が'='でないと無視される不具合
  1417. ;
  1418. ;    Revision 2.3  1997 10/13(Mon) 02:12:15 M.Kamada
  1419. ;    +51 直後へのbsr→pea
  1420. ;    +52 JMP/JSRを最適化する
  1421. ;
  1422. ;    Revision 2.2  1997  9/28(Sun) 19:56:57 M.Kamada
  1423. ;    +49 -mの後にスペースがあるとエラーになる
  1424. ;    +49 -cmnemonicを指定するとアドレスエラーが出ることがある
  1425. ;    +49 -cmnemonicを-c<mnemonic>に,他のスイッチも<>で囲んでみた
  1426. ;    +49 -up,-dp廃止,代わりに-y[n]を使用
  1427. ;
  1428. ;    Revision 2.1  1997  9/23(Tue) 03:32:58 M.Kamada
  1429. ;    +47 movepとfsccのエミュレーションを拡充
  1430. ;
  1431. ;    Revision 2.0  1997  9/15(Mon) 16:01:22 M.Kamada
  1432. ;    +46 error.sを分離,ST_VALUE=0で最適化
  1433. ;
  1434. ;    Revision 1.9  1997  9/17(Wed) 22:36:55 M.Kamada
  1435. ;    +43 -c0ですべての最適化を禁止する
  1436. ;    +44 software emulationの命令を展開する
  1437. ;
  1438. ;    Revision 1.8  1997  7/ 9(Wed) 02:36:17 M.Kamada
  1439. ;    +39 -1の挙動を修正
  1440. ;
  1441. ;    Revision 1.7  1997  6/26(Thu) 22:09:48 M.Kamada
  1442. ;    +33 プレデファインシンボルCPUに対応
  1443. ;    +34 プレデファインシンボル__DATE__,__TIME__に対応
  1444. ;    +35 CMP.bwl #0,Dn→TST.bwl Dn
  1445. ;    +36 MOVE.bw #0,Dn→CLR.bw Dn
  1446. ;    +37 -up,-dpでプレデファインシンボルの禁止,許可
  1447. ;    +38 CMPI.bwl #0,<ea>→TST.bwl <ea>
  1448. ;
  1449. ;    Revision 1.6  1997  3/29(Sat) 21:25:18 M.Kamada
  1450. ;    +24 MOVEAを最適化する
  1451. ;    +25 CLRを最適化する
  1452. ;    +26 ADDA/CMPA/SUBAを最適化する
  1453. ;    +27 -c4で拡張最適化許可
  1454. ;    +28 LEAを最適化する
  1455. ;    +29 ASLを最適化する
  1456. ;
  1457. ;    Revision 1.5  1997  3/14(Fri) 02:46:08 M.Kamada
  1458. ;    +18 サイズ指定のない定数でない絶対ロングを(d,OPC)にする
  1459. ;
  1460. ;    Revision 1.4  1997  2/ 2(Sun) 17:03:15 M.Kamada
  1461. ;    +15 -c1ならばNONULDISPだけセットする
  1462. ;        -wとlevelの間の空白を認めない
  1463. ;        -fとf,m,w,pの間の空白を認めない
  1464. ;
  1465. ;    Revision 1.3  1996 11/13(Wed) 15:27:30 M.Kamada
  1466. ;    +00 DEBUG追加
  1467. ;        テンポラリファイルを削除しない
  1468. ;    +99 タイトル変更
  1469. ;    +02 68060対応
  1470. ;        ヘルプメッセージ変更
  1471. ;    +05 デフォルトのターゲットMPUを常に68000にする
  1472. ;        デフォルトのターゲットMPUを常に68000にする
  1473. ;        ヘルプメッセージ変更
  1474. ;    +06 環境変数HASをコマンドラインの前に挿入する
  1475. ;        環境変数HASをコマンドラインの前に挿入する
  1476. ;        ヘルプメッセージ変更
  1477. ;
  1478. ;    Revision 1.2  1994/03/06  03:16:24  nakamura
  1479. ;    オプションスイッチの追加その他
  1480. ;
  1481. ;    Revision 1.1  1994/02/16  15:38:18  nakamura
  1482. ;    Initial revision
  1483. ;
  1484. ;
  1485.